import java.sql.SQLOutput;

/*

    实现线程的第二种方式：
        编写一个类实现java.lang.Runnable接口

    较为常用，实现接口还可以继承别的类，更优

    关于线程的sleep方法：
        public static void sleep(long millis)
        1、静态方法：Thread.sleep(1000);
        2、参数是毫秒
        3、作用：让当前线程进入休眠，进入“阻塞”状态，放弃占有的CPU时间片，让给其它的线程用
            这行代码出现在哪，当前的那个线程就会进入休眠
        4、sleep方法可以：间隔特定的时间，去执行一段特定的代码，每隔多久执行一次
    注意：sleep()是静态方法和对象无关，就算用new的线程对象去调用也会变成Thread.sleep();

    叫醒一个正在睡眠的线程，不是中断线程的执行，是终止线程的睡眠
        interrupt()

    强行终止线程：stop();已过时
    缺点：容易丢失数据，直接杀死线程

    合理的终止线程：打一个boolean标记

 */
public class ThreadTest02 {
    public static void main(String[] args) {
        //创建一个可运行的对象
        MyRunnable m = new MyRunnable();
        MyRunnable1 m1 = new MyRunnable1();
        //将可运行的对象封装成一个线程对象
        Thread t = new Thread(m);
        Thread t1 = new Thread(m1);
        //启动线程
        //t.start();
        t1.start();

        //希望5s之后，t醒了
        try {
            Thread.sleep(1000 * 5);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        //合理终止线程的执行，想要什么时候终止，把标记改为false即可
        m1.run = false;

        //中断t线程的睡眠（这种中断睡眠的方式依靠了java的异常处理机制）
        //t.interrupt();

    }
}

//这不是一个线程类，是一个可运行的类。他还不是一个线程。
class MyRunnable implements Runnable{

    @Override
    public void run() {
        System.out.println("begin");
        try {
            Thread.sleep(365 * 24 * 60 * 60 *1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("end");
    }
}

class MyRunnable1 implements Runnable{

    boolean run = true;

    @Override
    public void run() {
        for(int i = 0 ; i < 10 ; i++){
            if(run){
                System.out.println(i);
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }else{
                return;
            }
        }


    }
}
